const path = require('path')
const CopyPlugin = require('copy-webpack-plugin');
module.exports = {
  // 指定生产环境 静态资源引入采用相对文件夹路径 默认是根目录
  publicPath: process.env.NODE_ENV === 'production'? '/': '/',
  devServer: {
    disableHostCheck: true, // 允许其他电脑访问本机
  },
  productionSourceMap: false,//取消map映射

  // 通过链式编程的形式，来修改默认的webpack配置
  chainWebpack: config => {
    // 8kb一下压缩成base64  会导致打包体积增大  所以限制在8kb
    config.module
      .rule('images')
      .use('url-loader')
      .loader('url-loader')
      .tap(options => Object.assign(options, { limit: 8*1024 }))
        
    config.module
      .rule('thread-loader')
      .test(/\.js$/)
      .include
        .add(path.resolve('src'))
        .end()
      .use('thread-loader')
      .loader('thread-loader')
      .tap(() => {
        return { 
          workers: 2,
          workerParallelJobs: 50,
          workerNodeArgs: ['--max-old-space-size=1024'],
          poolRespawn: false,
          poolTimeout: 2000,
          poolParallelJobs: 50,
          name: 'my-pool', }
      })
  },
  // configureWebpack不支持vue cli的语法糖或者说是不支持链式编程配置形式。只能通过操作对象的形式，来修改默认的webpack配置
  configureWebpack: config => {
    // console.log(config);
    // 公共代码抽离
    config.optimization = {
      splitChunks: {
        chunks: 'async', //async 异步代码分割 initial同步代码分割 all同步异步分割都开启
        minSize: 1024 * 10, // 字节 引入的文件大于30kb才进行分割
        // maxSize: 0, //50kb，尝试将大于50kb的文件拆分成n个50kb的文件
        minChunks: 1, //模块至少使用次数
        maxAsyncRequests: 5, //同时加载的模块数量最多是5个，只分割出同时引入的前5个文件
        maxInitialRequests: 3,//首页加载的时候引入的文件最多3个
        automaticNameDelimiter: '~', //缓存组和生成文件名称之间的连接符
        cacheGroups: {//缓存组，将所有加载模块放在缓存里面一起分割打包
          Vant: {   //自定义打包模块
            name: 'Vant',
            test: /[\\/]node_modules[\\/]vant[\\/]/,
            minSize: 0,
            minChunks: 1,
            reuseExistingChunk: true,//模块嵌套引入时，判断是否复用已经被打包的模块
            chunks: 'all'
          },
          vendor: {
              chunks: 'all',
              test: /node_modules/,
              name: 'vendor',
              minChunks: 1,
              maxInitialRequests: 5,
              minSize: 1024 * 30,
              priority: -10 ,//优先级，先打包到哪个组里面，值越大，优先级越高
          },
          // 这种方式讲所有的包都拆分出来
          // vendor: {
          //   test: /[\\/]node_modules[\\/]/,
          //   name(module) {
          //     // get the name. E.g. node_modules/packageName/not/this/part.js
          //     // or node_modules/packageName
          //     const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
          //     // npm package names are URL-safe, but some servers don't like @ symbols
          //     return `npm.${packageName.replace('@', '')}`;
          //   },
          // },
        }
      },
      runtimeChunk: {
        name: (entry) => `runtime-${entry.name}.js`
      },
    }
    /** 在这个地方 return 最后会合并到webpack当中 */
    return{
      plugins: [
        new CopyPlugin({
          patterns: [
            { from: './src/assets/杨博2021年01月工资条.xlsx', to: 'other' },
          ],
        }),
      ],
    }
    // return{
      // module: {
          // {
          //   test: /\.js$/,
          //   include: path.resolve('src'),
          //   use: [
          //     {
          //       loader: 'thread-loader',
          //       options: {
          //         workers: 2,
          //         workerParallelJobs: 50,
          //         workerNodeArgs: ['--max-old-space-size=1024'],
          //         poolRespawn: false,
          //         poolTimeout: 2000,
          //         poolParallelJobs: 50,
          //         name: 'my-pool',
          //       },
          //     },
          //   ]
          // },
        // ],
      // },
    // }
  },
  css: {
    // 移动端使用
    loaderOptions: {
      postcss: {
        plugins: [
          require('postcss-plugin-px2rem')({
            rootValue:75,      // 设置转换基数，会自动根据该 基数进行rem值转换，如设置75，页面写入高度175px 则== 1775/75rem,该值通常根据设计稿等分数进行计算，使用淘宝方案等分就是10份
            mediaQuery: false, //（布尔值）允许在媒体查询中转换px。
            minPixelValue: 3, //设置要替换的最小像素值(3px会被转rem)。 默认 0
            exclude: /(node_module)/, // 排除指定的包，不对其进行转换，通常用于指定第三方包，默认为false
          }),
        ]
      }
    }
  },
}